home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
docs
/
ippon
/
data
/
expl
/
explzako.lzh
/
expl.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-11-12
|
6KB
|
274 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <XSP2lib.H>
#include <pcm8afnc.h>
#include <sys/dos.h>
#include <sys/iocs.h>
#include "expl.h"
#include "fxsp2lib.h"
#define PCG_MAX 1024 /* スプライトPCGパターン最大使用数 */
#define REF_MAX 1024 /* 複合スプライトリファレンスデータ最大使用数 */
#define FRM_MAX 1024 /* 複合スプライトフレームデータ最大使用数 */
#define RGB(r,g,b) ((g)<<11|(r)<<6|(b)<<1)
static char pcg_alt[PCG_MAX + 1]; /* PCG配置管理テーブル */
static char pcg_dat[PCG_MAX * 128]; /* PCGデータファイル読み込みバッファ */
static XOBJ_FRM_DAT frm_dat[FRM_MAX]; /* フレームデータ */
static XOBJ_REF_DAT ref_dat[REF_MAX]; /* リファレンスデータ */
static int old_crtmod;
extern int bomb_init0 (void);
extern void bomb_move (void);
extern void bomb_tini (void);
extern int seq_init0 (void);
extern void seq_init (void);
extern void seq_move (void);
extern void seq_tini (void);
extern unsigned char seq_counter;
int s_option = 0;
void usage (void)
{
printf ("爆発パターン表示&作成 expl.x ver0.01\n"
" programmed by Mitsuky <FreeSoftware>\n"
"[option]\n"
" -S数値 : 乱数のシードを指定\n"
);
}
/* 起動時のファイル読み込み */
/* 読み込みに失敗した場合はいきなり終了するので注意 */
int load_file (char *fname, void *ptr, size_t size, size_t n)
{
FILE *fp;
int i;
if ((fp = fopen (fname, "rb")) == NULL) {
//fatal_error (ERROR_FILE, fname);
}
i = fread (ptr, size, n, fp);
fclose (fp);
return (i); /* 返り値は読み込みバイト数 */
}
void wait_vdisp (void)
{
int sp;
sp = _iocs_b_super (0);
while ((*(volatile unsigned char *) 0xe88001) & 0x10 == 0);
while ((*(volatile unsigned char *) 0xe88001) & 0x10);
_iocs_b_super (sp);
}
void init (void)
{
int i, sp;
unsigned short *s, *d;
unsigned short pal_dat[16 * 15]; /* パレットデータファイル読み込みバッファ */
int sizeof_ref; /* 複合スプライトリファレンスデータ読み込み数 */
unsigned short crtcdata[9] =
{69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 785};
unsigned short textpalet[16] =
{0, RGB (16, 16, 20), RGB (12, 12, 20), RGB (28, 28, 31), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
old_crtmod = _iocs_crtmod (-1);
_iocs_b_curoff ();
wait_vdisp ();
_iocs_crtmod (14); /* 256*256dot 31kHz 65536色 */
_iocs_g_clr_on ();
_iocs_b_curoff ();
_iocs_ms_curof ();
_iocs_skey_mod (0, 0, 0);
//sp = _iocs_b_super (0);
//*(unsigned short *) 0xe82600 &= 0xff80; /* 画面表示全オフ */
//_iocs_b_super (sp);
_iocs_sp_init ();
_iocs_sp_on (); /* スプライト表示をON */
_iocs_bgctrlst (0, 0, 0); /* BG0表示OFF */
_iocs_bgctrlst (1, 1, 0); /* BG1表示OFF */
/* 256x256 正方形モードを作る */
sp = _iocs_b_super (0);
*(unsigned short *) 0xe80028 = crtcdata[8];
d = (unsigned short *) 0xe80002;
for (i = 1; i < 8; i++)
*d++ = crtcdata[i];
*(unsigned short *) 0xe80000 = crtcdata[0];
*(unsigned short *) 0xe8e006 |= 0b10; /* HRL ビット */
*(unsigned short *) 0xeb080c = crtcdata[2] + 4;
*(unsigned short *) 0xeb080a = crtcdata[0]; /* スプライト */
*(unsigned short *) 0xeb080e = crtcdata[6];
*(unsigned short *) 0xe82500 = 0b01001001001110; /* 優先順位 TX>SP>GR */
_iocs_b_super (sp);
load_file ("BOM.SP", pcg_dat, sizeof (char), 128 * PCG_MAX);
#if 0
load_file ("obj.xsp", pcg_dat + 256 * 128, sizeof (char), 128 * PCG_MAX);
load_file ("obj.frm", frm_dat, sizeof (XOBJ_FRM_DAT), FRM_MAX);
sizeof_ref = load_file ("obj.ref", ref_dat, sizeof (XOBJ_REF_DAT), REF_MAX);
#endif
load_file ("BOM01.PAL", pal_dat, 2, 16);
#if 0
/* FRM_DAT[].pt 補正 */
for (i = 0; i < 256; i++)
(short) frm_dat[i].pt += 256;
/* REF_DAT[].ptr 補正 */
for (i = 0; i < sizeof_ref; i++)
(int) ref_dat[i].ptr += (int) (&frm_dat[0]);
#endif
/* パレットに転送 */
sp = _iocs_b_super (0);
s = (unsigned short *) 0xe82200;
for (i = 0; i < 16; i++)
*s++ = textpalet[i];
d = pal_dat;
for (i = 0; i < 15 * 16; i++)
*s++ = *d++;
_iocs_b_super (sp);
{
struct _lineptr lp;
lp.x1 = 0;
lp.y1 = 128;
lp.x2 = 255;
lp.y2 = 128;
lp.color = 0xf800;
lp.linestyle = 0xaaaa;
_iocs_line (&lp);
lp.x1 = 128;
lp.y1 = 0;
lp.x2 = 128;
lp.y2 = 255;
_iocs_line (&lp);
}
seq_init0 ();
bomb_init0 ();
#if 0
enemy_init0 ();
#endif
_dos_breakck (2); /* BREAK チェックを殺す */
xsp_on ();
fxsp_on ();
xsp_mode (2);
xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
xsp_objdat_set (ref_dat);
pcm8a_vsyncint_on ();
//sp = _iocs_b_super (0);
//*(unsigned short *) 0xe82600 |= 0x007f; /* 画面表示オン */
//_iocs_b_super (sp);
}
int tini (void)
{
int sp;
pcm8a_vsyncint_off ();
xsp_off ();
fxsp_off ();
bomb_tini ();
wait_vdisp ();
sp = _iocs_b_super (0);
*(unsigned short *) 0xe8e006 &= 0xfffd; /* HRL ビット */
_iocs_b_super (sp);
_iocs_skey_mod (-1, 0, 0);
_iocs_b_curon ();
_iocs_crtmod (old_crtmod);
return (0);
}
void game (void)
{
seq_init ();
// do {
for (;;) {
//xsp_vsync (20);
seq_move ();
bomb_move ();
fxsp_out ();
if (!xsp_out ())
break;
}
seq_counter = 0;
// } while ((_iocs_ms_getdt ()& 0xff00) == 0);
}
int main (int argc, char *argv[])
{
int i;
int slash_flag = 0;
int fname_found_flag = 0; /* ファイル名が1つでもあったか */
{
char *temp;
temp = getenv ("SLASH");
if ((temp != NULL) && (*temp == '/')) {
slash_flag = 1;
}
}
for (i = 1; i < argc; i++) {
if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
switch (*(argv[i] + 1)) {
case 's':
case 'S':
sscanf (argv[i] + 2, "%d", &s_option);
break;
default:
usage ();
return (-1);
}
} else {
fname_found_flag = 1;
}
}
srand(s_option);
#if 0
if (fname_found_flag == 0) {
usage ();
return (-1);
}
#endif
init ();
game ();
tini ();
return (0);
}